package com.zql.JianZhiOffer;

import java.util.*;

/**
 * 求第一个只出现一次的字符
 * Created By ShuHua on 2022/5/3.
 */
public class Offer_50 {
    /**
     * 使用这种方法实现 思路是很简单，但是实现起来需要考虑字符串的边界问题 就很复杂
     * 这里就不再实现
     * @param s
     * @return
     */
    public char firstUniqChar(String s) {
        if(s=="")return ' ';
        char[] chars = s.toCharArray();
        if(chars.length<2) return s.charAt(0);
        for(int i=0;i<chars.length;i++){

            if(!(s.substring(0,i).contains(String.valueOf(chars[i]))&&
                    s.substring(i+1,chars.length).contains(String.valueOf(chars[i]))))
                return chars[i];
        }
        return ' ';
    }

    /**
     * hashmap实现 21ms
     * @param s
     * @return
     */
    public char firstUniqChar2(String s) {
        if(s=="") return ' ';
        Map<Character,Boolean> map = new HashMap<>();
        for(char c:s.toCharArray()){
            if(map.containsKey(c)){
                map.put(c,false);
            }else {
                map.put(c,true);
            }
        }

        for(char c:s.toCharArray()){
            if(map.get(c))return c;
        }
        return ' ';
    }

    /**
     * 使用set 用时较长 71ms
     * @param s
     * @return
     */
    public char firstUniqChar3(String s) {
        if(s=="") return ' ';
        Set<Character> set = new HashSet<>();
        char[] chars = s.toCharArray();
        for(char c:chars){
            if(!set.add(c)){
                s=s.replace(String.valueOf(c),"");
            }
        }
        return s.isEmpty()?' ':s.charAt(0);
    }

    /**
     * 使用LinkedHashMap实现 22ms
     * @param s
     * @return
     */
    public char firstUniqChar4(String s) {
        if(s=="") return ' ';
        Map<Character,Boolean> map = new LinkedHashMap<>();
        for(char c:s.toCharArray()){
            if(map.containsKey(c)){
                map.put(c,false);
            }else {
                map.put(c,true);
            }
        }
        for (Map.Entry<Character,Boolean> entry:map.entrySet()){
            if(entry.getValue())return entry.getKey();
        }
        return ' ';
    }

    public static void main(String[] args) {
        String s ="ab";
        System.out.println(s.substring(0,0));
        System.out.println(s.substring(0,1));
        System.out.println(s.substring(1,2));
        System.out.println(s.substring(2,2));
    }
}
